关于deferred对象
简单来说,deferred对象就是jQuery的回调函数解决方案。本意是”延迟“,即程序延迟到某个点再向下执行。
主要
- 类比于传统ajax操作,运用deferred对象后的链式写法使得代码的可读性更强。
$.ajax(
url: "fukua.html",
success: function(){
alert("messi is best!");
},
error: function(){
alert("messi is no better than!");
}
)
- 如上,$.ajax()接受一个对象参数,成功、失败分别对应success、error方法。若用deferred延迟对象则可用done、fail方法解决。
$.ajax("fukua.html")
.done(function(){alert("messi is best!");})
.fail(function(){alert("messi is no better than!");})
- deferred对象的优点更在于她可以给多个事件绑定多个回调函数。
$.ajax("fukua.html")
.done(function(){alert("messi is best!");})
.fail(function(){alert("messi is no better than!");})
.done(function(){alert("messi is very good!");})
- 如上,要为多个事件绑定回调需要用到$.when()。
$.when($.ajax("fukua.html"),$.ajax("messi.html"))
.done(function(){alert("messi is best!");})
.fail(function(){alert("messi is no better than!");})
- deferred对象的最大优点在于,她把整个一套回调函数接口从ajax操作扩展到了所有操作,即不仅是ajax还是本地操作,不管异步还是同步,都可以使用deferred对象的方法。
$.when(anyFunc())
.done(function(){alert("messi is best!");})
.fail(function(){alert("messi is no better than!");})
- 如上,当参数是普通函数时done()方法会立即执行,原因在于$.when()的参数只能是deferred对象。
var testParam = $.Deferred(); //新建一个deferred对象
var anyFunc = function(testParam){
var testFunc = function(){
alert("It is OK!");
testParam.resolve(); //改变deferred对象的执行状态
}
return testParam;
}
//现在anyFunc返回的是deferred对象了,即可运用链式操作
$.when(anyFunc(testParam))
.done(function(){alert("messi is best!");})
.fail(function(){alert("messi is no better than!");})